package com.dog.basics.service.common.impl;


import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dog.basics.bean.dto.admin.common.AppVersionInfoAdminPageDto;
import com.dog.basics.bean.dto.admin.common.AppVersionInfoAdminAddDto;
import com.dog.basics.bean.dto.api.common.AppVersionInfoApiPageDto;
import com.dog.basics.bean.model.common.DogAppVersionInfo;
import com.dog.basics.bean.vo.api.common.ApiAppVersionInfoApiVo;
import com.dog.basics.bean.vo.admin.common.DogAppVersionInfoPageVo;
import com.dog.basics.common.properties.FileProperties;
import com.dog.basics.common.util.AppVersionInfo;
import com.dog.basics.common.util.PageParam;
import com.dog.basics.common.util.ReadUtil;
import com.dog.basics.dao.common.DogAppVersionInfoMapper;
import com.dog.basics.security.util.SecurityUtils;
import com.dog.basics.service.common.IDogAppVersionInfoService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * APP版本升级 - 记录信息 服务实现类
 * </p>
 *
 * @author guoy
 * @since 2020-03-23
 */
@Service
@AllArgsConstructor
public class DogAppVersionInfoServiceImpl extends ServiceImpl<DogAppVersionInfoMapper, DogAppVersionInfo> implements IDogAppVersionInfoService {
    private final FileProperties fileProperties;

    /**
     * 查询列表  - 分页返回信息
     *
     * @return guonh 2020年1月10日
     */
    @Override
    public IPage<DogAppVersionInfoPageVo> selecyVersionPage(PageParam param,
                                                            AppVersionInfoAdminPageDto dogAppVersionInfoDto) {
        IPage page = this.page(param, Wrappers.<DogAppVersionInfo>lambdaQuery()
                .like(StrUtil.isNotBlank(dogAppVersionInfoDto.getName()), DogAppVersionInfo::getName,
                        dogAppVersionInfoDto.getName())
                .like(StrUtil.isNotBlank(dogAppVersionInfoDto.getVersionCode()), DogAppVersionInfo::getVersionCode,
                        dogAppVersionInfoDto.getVersionCode())
                .eq(StrUtil.isNotBlank(dogAppVersionInfoDto.getVersionName()), DogAppVersionInfo::getVersionName,
                        dogAppVersionInfoDto.getVersionName())
                .eq(ObjectUtil.isNotNull(dogAppVersionInfoDto.getAppType()), DogAppVersionInfo::getAppType,
                        dogAppVersionInfoDto.getAppType())
                .orderByDesc(DogAppVersionInfo::getCreateTime));
        List<DogAppVersionInfo> records = page.getRecords();
        records.stream().map(e -> {
            DogAppVersionInfoPageVo infoVo = new DogAppVersionInfoPageVo();
            BeanUtil.copyProperties(e, infoVo);
            return infoVo;
        }).collect(Collectors.toList());
        return page;
    }

    /**
     * 添加版本信息 (全自动获取)
     *
     * @param dto
     * @return guonh 2020年1月9日
     */
    @Override
    public Boolean saveAuthObtainInfo(AppVersionInfoAdminAddDto dto) {

        //判断是什么类型的安装包
        AppVersionInfo versionInfo = null;
        if (dto.getAppType() == 0) {
            versionInfo = ReadUtil.readApk(fileProperties.getPath() + fileProperties.getPathname() + dto.getApkWrap());
        } else if (dto.getAppType() == 1) {
            versionInfo = ReadUtil.readIpa(fileProperties.getPath() + fileProperties.getPathname() + dto.getApkWrap());
        } else if (dto.getAppType() == 2) {
            versionInfo = ReadUtil.readWgt(fileProperties.getPath() + fileProperties.getPathname() + dto.getApkWrap());
        } else if (dto.getAppType() == 3) {
            Validator.validateNotNull(dto.getAppVersionInfo(), "版本信息为空");
            Validator.validateTrue(StrUtil.isNotBlank(dto.getAppVersionInfo().getItemName()), "固件项目名不能为空");
            Validator.validateTrue(StrUtil.isNotBlank(dto.getAppVersionInfo().getPackageName()), "固件包名不能为空");
            Validator.validateTrue(StrUtil.isNotBlank(dto.getAppVersionInfo().getVersionNo()), "固件版本号不能为空");
            Validator.validateTrue(StrUtil.isNotBlank(dto.getAppVersionInfo().getVersionCode()), "固件code不能为空");
            versionInfo = dto.getAppVersionInfo();
        }
        //获取版本信息
        Validator.validateNotNull(versionInfo, "获取对应安装包版本信息出错,请核实是否对应的安装包!");
        //封装添加信息
        DogAppVersionInfo dogAppVersionInfo = new DogAppVersionInfo();
        BeanUtil.copyProperties(dto, dogAppVersionInfo);
        if(dto.getAppType() == 3){
            dogAppVersionInfo.setPkgName(dto.getPkgName());
            dogAppVersionInfo.setVersionCode(dto.getVersionCode());
        }else{
            dogAppVersionInfo.setName(versionInfo.getItemName());
            dogAppVersionInfo.setPkgName(versionInfo.getPackageName());
            dogAppVersionInfo.setVersionName(versionInfo.getVersionNo());
            dogAppVersionInfo.setVersionCode(versionInfo.getVersionCode());
        }

        dogAppVersionInfo.setCreateBy(SecurityUtils.getSysUser().getUserId());
        dogAppVersionInfo.setCreateTime(DateUtil.currentSeconds());
        Validator.validateTrue(this.save(dogAppVersionInfo), "添加APP版本失败");
        return Boolean.TRUE;
    }

    /**
     * 查询最新的版本信息
     *
     * @param dto
     * @return guonh 2020年1月10日
     */
    @Override
    public ApiAppVersionInfoApiVo getAppVersionInfo(PageParam param, AppVersionInfoApiPageDto dto) {
        // 版本记录赋值1
        param.setSize(1L);
        // 查询版本信息
        this.page(param, Wrappers.<DogAppVersionInfo>lambdaQuery()
                .eq(ObjectUtil.isNotNull(dto.getAppType()), DogAppVersionInfo::getAppType, dto.getAppType())
                .eq(StrUtil.isNotBlank(dto.getName()), DogAppVersionInfo::getName, dto.getName())
                .eq(StrUtil.isNotBlank(dto.getVersionName()), DogAppVersionInfo::getVersionName, dto.getVersionName())
                .eq(StrUtil.isNotBlank(dto.getVersionCode()), DogAppVersionInfo::getVersionCode, dto.getVersionCode())
                .orderByDesc(DogAppVersionInfo::getCreateTime));
        // 数据信息格式化
        List<DogAppVersionInfo> records = param.getRecords();
        if (CollUtil.isNotEmpty(records)) {
            return BeanUtil.toBean(records.get(0), ApiAppVersionInfoApiVo.class);
        }
        return null;
    }
}
